#ifndef __USRT_H
#define __USRT_H

#include "my_define.h"

//串口
#define UART_TX_BUFLEN		4096		//发送缓冲总大小
#define UART_RX_BUFLEN		2048		//接收缓冲总大小
#define UART_TX_DATALEN		1024		//发送单条数据最大长度
#define UART_RX_DATALEN		1024		//接收单条数据最大长度
#define UART_TX_QUEUELEN	30			//发送队列数据条数
#define UART_RX_QUEUELEN	30			//接收队列数据条数
#define UART0_BAUD			115200		//波特率
#define UART1_BAUD			9600
#define UART2_BAUD			115200
#define UART3_BAUD			115200
#define UART4_BAUD			115200

//串口 0-3收发都是DMA加队列方式
typedef struct 
{
	u16 addr;								//首字节数组下标
	u16 len;								//发送长度
}uart_tx_t;
typedef struct 
{
	u16 first;								//第一个字节数组下标
	u16 last;								//最后一个字节数组下标
}uart_rx_t;

typedef struct
{
	struct{
		u8 busy:1;							
	}flags;						
	uart_tx_t info_queue[UART_TX_QUEUELEN];	//全部指令环形队列
	uart_tx_t info;							//当前取出的指令信息
	u16 front;								//队列头数组下标
	u16 rear;								//队列尾数组下标
	u16 buf_front;							//缓存头数组下标
	u16 buf_rear;							//缓存尾数组下标
}tx_queue_t;
typedef struct
{
	struct{
		u8 busy:1;							
	}flags;						
	uart_rx_t info_queue[UART_RX_QUEUELEN];	//全部指令环形队列
	uart_rx_t info;							//当前取出的指令信息
	u16 front;								//队列头数组下标
	u16 rear;								//队列尾数组下标
	u16 dma_addr;							//当前DMA写到的地址	
}rx_queue_t;

typedef struct{
	u8 txbuf[UART_TX_BUFLEN];				//初始化串口之后这4个缓冲由队列以及DMA自动调用，不可手动填入数据
	u8 rxbuf[UART_RX_BUFLEN];
	u8 txdata[UART_TX_DATALEN];
	u8 rxdata[UART_RX_DATALEN];
	tx_queue_t tx_queue;
	rx_queue_t rx_queue;
}mUart_t;	//占用超过24K内存
extern volatile mUart_t mUart[4];

void uart0_init(u32 baud);
void uart1_init(u32 baud);
void uart2_init(u32 baud);
void uart3_init(u32 baud);
void uart4_init(u32 baud);
void uart0_send(u8 *buf,u16 len);
void uart1_send(u8 *buf,u16 len);
void uart2_send(u8 *buf,u16 len);
void uart3_send(u8 *buf,u16 len);
void uart4_send(u8 *buf,u16 len);
u16 uart_tx_get_queue_data_num(u8 n);
u16 uart_rx_get_queue_data_num(u8 n);
void uart_tx_clear_queue(u8 n);
void uart_rx_clear_queue(u8 n);
void uart_tx_write_to_queue(u8 n,u8 *buf,u16 len);
void uart_rx_write_to_queue(u8 n,u16 first,u16 last);
void uart_tx_read_from_queue(void);
void uart_rx_read_from_queue(void);
void uart0_rxproc(u8 *buf,u16 len);
void uart1_rxproc(u8 *buf,u16 len);
void uart2_rxproc(u8 *buf,u16 len);
void uart3_rxproc(u8 *buf,u16 len);
void uart0_send_no_queue(u8 *buf,u16 len);

#endif



